<?php
/**
 * webtrees: online genealogy
 * Copyright (C) 2018 webtrees development team
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
namespace Fisharebest\Webtrees\Report;

use Fisharebest\Webtrees\I18N;

/**
 * Class ReportBase
 */
class ReportBase
{
    /** User measure unit. */
    const UNITS = 'pt';

    /** webtrees URL */
    const WT_URL = WT_WEBTREES_URL;

    /** @var float Left Margin (expressed in points) Default: 17.99 mm, 0.7083 inch */
    public $leftmargin = 51.0;

    /** @var float Right Margin (expressed in points) Default: 9.87 mm, 0.389 inch */
    public $rightmargin = 28.0;

    /** @var float Top Margin (expressed in points) Default: 26.81 mm */
    public $topmargin = 76.0;

    /** @var float Bottom Margin (expressed in points) Default: 21.6 mm */
    public $bottommargin = 60.0;

    /** @var float Header Margin (expressed in points) Default: 4.93 mm */
    public $headermargin = 14.0;

    /** @var float Footer Margin (expressed in points) Default: 9.88 mm, 0.389 inch */
    public $footermargin = 28.0;

    /** @var string Page orientation (portrait, landscape) */
    public $orientation = 'portrait';

    /** @var string Page format name */
    public $pageFormat = 'A4';

    /** @var float Height of page format in points */
    public $pageh = 0.0;

    /** @var float Width of page format in points */
    public $pagew = 0.0;

    /** @var string[][] An array of the Styles elements found in the document */
    public $Styles = [];

    /** @var string The default Report font name */
    public $defaultFont = 'dejavusans';

    /** @var int The default Report font size */
    public $defaultFontSize = 12;

    /** @var string Header (H), Page header (PH), Body (B) or Footer (F) */
    public $processing = 'H';

    /** @var bool RTL Language (false=LTR, true=RTL) */
    public $rtl = false;

    /** @var bool Show the Generated by... (true=show the text) */
    public $showGenText = true;

    /** @var string Generated By... text */
    public $generatedby = '';

    /** @var string The report title */
    public $title = '';

    /** @var string Author of the report, the users full name */
    public $rauthor = WT_WEBTREES . ' ' . WT_VERSION;

    /** @var string Keywords */
    public $rkeywords = '';

    /** @var string Report Description / Subject */
    public $rsubject = '';

    /**
     * Initial Setup - ReportBase
     *
     * Setting up document wide defaults that will be inherited of the report modules
     * As DEFAULT A4 and Portrait will be used if not set
     *
     * @return void
     */
    public function setup()
    {
        // Set RTL direction
        if (I18N::direction() === 'rtl') {
            $this->rtl = true;
        }
        // Set the Keywords
        $this->rkeywords = '';
        // Generated By...text
        // I18N: This is a report footer. %s is the name of the application.
        $this->generatedby = I18N::translate('Generated by %s', WT_WEBTREES . ' ' . WT_VERSION);

        // For known size pages
        if ($this->pagew == 0 && $this->pageh == 0) {
            /**
             * The current ISO 216 standard was introduced in 1975 and is a direct follow up to the german DIN 476 standard from 1922. ISO 216 is also called EN 20216 in Europe.
             * The ISO paper sizes are based on the metric system so everything else is aproxiamte
             *
             * The Series A is used for Standard Printing and Stationary.
             * The Series B is used for Posters, Wall-Charts etc.
             * The C series is used for folders, post cards and envelopes. C series envelope is suitable to insert A series sizes.
             * ISO also define format series RA and SRA for untrimmed raw paper, where SRA stands for 'supplementary raw format A'.
             * Japan has adopted the ISO series A sizes, but its series B sizes are slightly different. These sizes are sometimes called JIS B or JB sizes.
             *  sun was a unit of length used in Japan and is equal to about 3.03 cm or 1.193 inches
             * The United States, Canada, and in part Mexico, are today the only industrialized nations in which the ISO standard paper sizes are not yet widely used.
             *
             * A0 & A1        Technical drawings, posters
             * A1 & A2        Flip charts
             * A2 & A3        Drawings, diagrams, large tables
             * A4             Letters, magazines, forms, catalogs, laser printer and copying machine output
             * A5             Note pads
             * A6             Postcards
             * B5, A5, B6  A6 Books
             * C4, C5, C6     Envelopes for A4 letters: unfolded (C4), folded once (C5), folded twice (C6)
             * B4 & A3        Newspapers, supported by most copying machines in addition to A4
             * B8 & A8        Playing cards
             *
             * 1 inch = 72 points
             * 1 mm = 2.8346457 points
             * 1 inch = 25.4 mm
             * 1 point = 0,35278 mm
             */
            switch ($this->pageFormat) {
                // ISO A series
                case '4A0': // ISO 216, 1682 mm x 2378 mm
                    $sizes = [
                        4767.86,
                        6740.79,
                    ];
                    break;
                case '2A0': // ISO 216, 1189 mm x 1682 mm
                    $sizes = [
                        3370.39,
                        4767.86,
                    ];
                    break;
                case 'A0': // ISO 216, 841 mm x 1189mm
                    $sizes = [
                        2383.94,
                        3370.39,
                    ];
                    break;
                case 'A1': // ISO 216, 594 mm x 841 mm
                    $sizes = [
                        1683.78,
                        2383.94,
                    ];
                    break;
                case 'A2': // ISO 216, 420 mm x 594 mm
                    $sizes = [
                        1190.55,
                        1683.78,
                    ];
                    break;
                case 'A3': // ISO 216, 297 mm x 420 mm
                    $sizes = [
                        841.89,
                        1190.55,
                    ];
                    break;
                case 'A4': // ISO 216, 210 mm 297 mm
                    $sizes = [
                        595.28,
                        841.89,
                    ];
                    break;
                case 'A5': // ISO 216, 148 mm x 210 mm
                    $sizes = [
                        419.53,
                        595.28,
                    ];
                    break;
                case 'A6': // ISO 216, 105 mm x 148 mm
                    $sizes = [
                        297.64,
                        419.53,
                    ];
                    break;
                case 'A7': // ISO 216, 74 mm x 105 mm
                    $sizes = [
                        209.76,
                        297.64,
                    ];
                    break;
                case 'A8': // ISO 216, 52 mm x 74 mm
                    $sizes = [
                        147.40,
                        209.76,
                    ];
                    break;
                case 'A9': // ISO 216, 37 mm x 52 mm
                    $sizes = [
                        104.88,
                        147.40,
                    ];
                    break;
                case 'A10': // ISO 216, 26 mm x 37 mm
                    $sizes = [
                        73.70,
                        104.88,
                    ];
                    break;

                // ISO B series
                case 'B0': // ISO 216, 1000 mm x 1414 mm
                    $sizes = [
                        2834.65,
                        4008.19,
                    ];
                    break;
                case 'B1': // ISO 216, 707 mm x 1000 mm
                    $sizes = [
                        2004.09,
                        2834.65,
                    ];
                    break;
                case 'B2': // ISO 216, 500 mm x 707 mm
                    $sizes = [
                        1417.32,
                        2004.09,
                    ];
                    break;
                case 'B3': // ISO 216, 353 mm x 500 mm
                    $sizes = [
                        1000.63,
                        1417.32,
                    ];
                    break;
                case 'B4': // ISO 216, 250 mm x 353 mm
                    $sizes = [
                        708.66,
                        1000.63,
                    ];
                    break;
                case 'B5': // ISO 216, 176 mm x 250 mm
                    $sizes = [
                        498.90,
                        708.66,
                    ];
                    break;
                case 'B6': // ISO 216, 125 mm x 176 mm
                    $sizes = [
                        354.33,
                        498.90,
                    ];
                    break;
                case 'B7': // ISO 216, 88 mm x 125 mm
                    $sizes = [
                        249.45,
                        354.33,
                    ];
                    break;
                case 'B8': // ISO 216, 62 mm x 88 mm
                    $sizes = [
                        175.75,
                        249.45,
                    ];
                    break;
                case 'B9': // ISO 216, 44 mm x 62 mm
                    $sizes = [
                        124.72,
                        175.75,
                    ];
                    break;
                case 'B10': // ISO 216, 31 mm x 44 mm
                    $sizes = [
                        87.87,
                        124.72,
                    ];
                    break;

                // ISO C series, Envelope
                case 'C0': // ISO 269, 917 mm x 1297 mm, For flat A0 sheet
                    $sizes = [
                        2599.37,
                        3676.54,
                    ];
                    break;
                case 'C1': // ISO 269, 648 mm x 917 mm, For flat A1 sheet
                    $sizes = [
                        1836.85,
                        2599.37,
                    ];
                    break;
                case 'C2': // ISO 269, 458 mm x 648 mm, For flat A2 sheet, A1 folded in half
                    $sizes = [
                        1298.27,
                        1836.85,
                    ];
                    break;
                case 'C3': // ISO 269, 324 mm x 458 mm, For flat A3 sheet, A2 folded in half
                    $sizes = [
                        918.43,
                        1298.27,
                    ];
                    break;
                case 'C4': // ISO 269, 229 mm x 324 mm, For flat A4 sheet, A3 folded in half
                    $sizes = [
                        649.13,
                        918.43,
                    ];
                    break;
                case 'C5': // ISO 269, 162 mm x 229 mm, For flat A5 sheet, A4 folded in half
                    $sizes = [
                        459.21,
                        649.13,
                    ];
                    break;
                case 'C6/5': // ISO 269, 114 mm x 229 mm. A5 folded twice = 1/3 A4. Alternative for the DL envelope
                    $sizes = [
                        323.15,
                        649.13,
                    ];
                    break;
                case 'C6': // ISO 269, 114 mm x 162 mm, For A5 folded in half
                    $sizes = [
                        323.15,
                        459.21,
                    ];
                    break;
                case 'C7/6': // ISO 269, 81 mm x 162 mm, For A5 sheet folded in thirds
                    $sizes = [
                        229.61,
                        459.21,
                    ];
                    break;
                case 'C7': // ISO 269, 81 mm x 114 mm, For A5 folded in quarters
                    $sizes = [
                        229.61,
                        323.15,
                    ];
                    break;
                case 'C8': // ISO 269, 57 mm x 81 mm
                    $sizes = [
                        161.57,
                        229.61,
                    ];
                    break;
                case 'C9': // ISO 269, 40 mm x 57 mm
                    $sizes = [
                        113.39,
                        161.57,
                    ];
                    break;
                case 'C10': // ISO 269, 28 mm x 40 mm
                    $sizes = [
                        79.37,
                        113.39,
                    ];
                    break;
                case 'DL': // Original DIN 678 but ISO 269 now has this C6/5 , 110 mm x 220 mm, For A4 sheet folded in thirds, A5 in half
                    $sizes = [
                        311.81,
                        623.62,
                    ];
                    break;

                // Untrimmed stock sizes for the ISO-A Series - ISO primary range
                case 'RA0': // ISO 478, 860 mm x 1220 mm
                    $sizes = [
                        2437.80,
                        3458.27,
                    ];
                    break;
                case 'RA1': // ISO 478, 610 mm x 860 mm
                    $sizes = [
                        1729.13,
                        2437.80,
                    ];
                    break;
                case 'RA2': // ISO 478, 430 mm x 610 mm
                    $sizes = [
                        1218.90,
                        1729.13,
                    ];
                    break;
                case 'RA3': // ISO 478, 305 mm x 430 mm
                    $sizes = [
                        864.57,
                        1218.90,
                    ];
                    break;
                case 'RA4': // ISO 478, 215 mm x 305 mm
                    $sizes = [
                        609.45,
                        864.57,
                    ];
                    break;

                // Untrimmed stock sizes for the ISO-A Series - ISO supplementary range
                case 'SRA0': // ISO 593, 900 mm x 1280 mm
                    $sizes = [
                        2551.18,
                        3628.35,
                    ];
                    break;
                case 'SRA1': // ISO 593, 640 mm x 900 mm
                    $sizes = [
                        1814.17,
                        2551.18,
                    ];
                    break;
                case 'SRA2': // ISO 593, 450 mm x 640 mm
                    $sizes = [
                        1275.59,
                        1814.17,
                    ];
                    break;
                case 'SRA3': // ISO 593, 320 mm x 450 mm
                    $sizes = [
                        907.09,
                        1275.59,
                    ];
                    break;
                case 'SRA4': // ISO 593, 225 mm x 320 mm
                    $sizes = [
                        637.80,
                        907.09,
                    ];
                    break;

                // ISO size variations
                case 'A2EXTRA': // ISO 216, 445 mm x 619 mm
                    $sizes = [
                        1261.42,
                        1754.65,
                    ];
                    break;
                case 'A2SUPER': // ISO 216, 305 mm x 508 mm
                    $sizes = [
                        864.57,
                        1440.00,
                    ];
                    break;
                case 'A3EXTRA': // ISO 216, 322 mm x 445 mm
                    $sizes = [
                        912.76,
                        1261.42,
                    ];
                    break;
                case 'SUPERA3': // ISO 216, 305 mm x 487 mm
                    $sizes = [
                        864.57,
                        1380.47,
                    ];
                    break;
                case 'A4EXTRA': // ISO 216, 235 mm x 322 mm
                    $sizes = [
                        666.14,
                        912.76,
                    ];
                    break;
                case 'A4LONG': // ISO 216, 210 mm x 348 mm
                    $sizes = [
                        595.28,
                        986.46,
                    ];
                    break;
                case 'A4SUPER': // ISO 216, 229 mm x 322 mm
                    $sizes = [
                        649.13,
                        912.76,
                    ];
                    break;
                case 'SUPERA4': // ISO 216, 227 mm x 356 mm
                    $sizes = [
                        643.46,
                        1009.13,
                    ];
                    break;
                case 'A5EXTRA': // ISO 216, 173 mm x 235 mm
                    $sizes = [
                        490.39,
                        666.14,
                    ];
                    break;
                case 'SOB5EXTRA': // ISO 216, 202 mm x 276 mm
                    $sizes = [
                        572.60,
                        782.36,
                    ];
                    break;

                // Japanese version of the ISO 216 B series
                case 'JB0': // JIS P 0138-61, 1030 mm x 1456 mm
                    $sizes = [
                        2919.69,
                        4127.24,
                    ];
                    break;
                case 'JB1': // JIS P 0138-61, 728 mm x 1030 mm
                    $sizes = [
                        2063.62,
                        2919.69,
                    ];
                    break;
                case 'JB2': // JIS P 0138-61, 515 mm x 728 mm
                    $sizes = [
                        1459.84,
                        2063.62,
                    ];
                    break;
                case 'JB3': // JIS P 0138-61, 364 mm x 515 mm
                    $sizes = [
                        1031.81,
                        1459.84,
                    ];
                    break;
                case 'JB4': // JIS P 0138-61, 257 mm x 364 mm
                    $sizes = [
                        728.50,
                        1031.81,
                    ];
                    break;
                case 'JB5': // JIS P 0138-61, 182 mm x 257 mm
                    $sizes = [
                        515.91,
                        728.50,
                    ];
                    break;
                case 'JB6': // JIS P 0138-61, 128 mm x 182 mm
                    $sizes = [
                        362.83,
                        515.91,
                    ];
                    break;
                case 'JB7': // JIS P 0138-61, 91 mm x 128 mm
                    $sizes = [
                        257.95,
                        362.83,
                    ];
                    break;
                case 'JB8': // JIS P 0138-61, 64 mm x 91 mm
                    $sizes = [
                        181.42,
                        257.95,
                    ];
                    break;
                case 'JB9': // JIS P 0138-61, 45 mm x 64 mm
                    $sizes = [
                        127.56,
                        181.42,
                    ];
                    break;
                case 'JB10': // JIS P 0138-61, 32 mm x 45 mm
                    $sizes = [
                        90.71,
                        127.56,
                    ];
                    break;

                // US pages
                case 'EXECUTIVE': // 7.25 in x 10.5 in
                    $sizes = [
                        522.00,
                        756.00,
                    ];
                    break;
                case 'FOLIO': // 8.5 in x 13 in
                    $sizes = [
                        612.00,
                        936.00,
                    ];
                    break;
                case 'FOOLSCAP': // 13.5 in x 17 in
                    $sizes = [
                        972.00,
                        1224.00,
                    ];
                    break;
                case 'LEDGER': // 11 in x 17 in
                    $sizes = [
                        792.00,
                        1224.00,
                    ];
                    break;
                case 'LEGAL': // 8.5 in x 14 in
                    $sizes = [
                        612.00,
                        1008.00,
                    ];
                    break;
                case 'LETTER': // 8.5 in x 11 in
                    $sizes = [
                        612.00,
                        792.00,
                    ];
                    break;
                case 'QUARTO': // 8.46 in x 10.8 in
                    $sizes = [
                        609.12,
                        777.50,
                    ];
                    break;
                case 'STATEMENT': // 5.5 in x 8.5 in
                    $sizes = [
                        396.00,
                        612.00,
                    ];
                    break;
                case 'USGOVT': // 8 in x 11 in
                    $sizes = [
                        576.00,
                        792.00,
                    ];
                    break;
                default:
                    $this->pageFormat = 'A4';
                    $sizes            = [
                        595.28,
                        841.89,
                    ];
                    break;
            }
            $this->pagew = $sizes[0];
            $this->pageh = $sizes[1];
        } else {
            if ($this->pagew < 10) {
                throw new \DomainException('REPORT ERROR ReportBase::setup(): For custom size pages you must set "customwidth" larger then this in the XML file');
            }
            if ($this->pageh < 10) {
                throw new \DomainException('REPORT ERROR ReportBase::setup(): For custom size pages you must set "customheight" larger then this in the XML file');
            }
        }
    }

    /**
     * Process the Header , Page header, Body or Footer - ReportBase
     *
     * @param string $p Header (H), Page header (PH), Body (B) or Footer (F)
     *
     * @return int
     */
    public function setProcessing($p): int
    {
        $this->processing = $p;

        return 0;
    }

    /**
     * Add the Title when raw character data is used in Title - ReportBase
     *
     * @param string $data
     *
     * @return int
     */
    public function addTitle($data): int
    {
        $this->title .= $data;

        return 0;
    }

    /**
     * Add the Description when raw character data is used in Description - ReportBase
     *
     * @param string $data
     *
     * @return int
     */
    public function addDescription($data): int
    {
        $this->rsubject .= $data;

        return 0;
    }

    /**
     * Add Style to Styles array - ReportBase
     *
     * @param array $style
     *
     * @return int
     */
    public function addStyle($style): int
    {
        $this->Styles[$style['name']] = $style;

        return 0;
    }

    /**
     * Get a style from the Styles array - ReportBase
     *
     * @param string $s Style name
     *
     * @return array
     */
    public function getStyle($s): array
    {
        if (!isset($this->Styles[$s])) {
            return current($this->Styles);
        }

        return $this->Styles[$s];
    }
}
